package com.gupao.proxy.cglib;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class GpMeipo implements MethodInterceptor {

    //获取被代理人的资料
    public Object getInstance( Class object)throws Exception{

        Enhancer enhancer = new Enhancer();
        //把父类设置为哪一个
        //这一步告诉CGlib,生成的子类需要继承哪一个类
        enhancer.setSuperclass(object);

        //设置回调
        enhancer.setCallback(this);

        //通过反射机制
        //1、生成源代码
        //2、编译class
        //3、加载到JVM中，并返回被代理对象

        return enhancer.create();
    }

    //同样是 做了字节码重组
    //java用户无感知，cglib自动创建一个子类
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

        System.out.println("开始进行海选。。。。" );
        System.out.println("---------------------------" );
        //这个对象的引用是CGlib自己给我们new出来的
        //CGlib new出来的对象是被代理对象的子类
        //OOP 在new子类之前，实际上是默认调用了super()方法的
        //new子类之前，必须new父类，这相当于间接的持有了父类的引用
        //子类重写父类的所有方法
        //改变子类的某些属性，是可以间接的操作父类的方法
        methodProxy.invokeSuper(o,objects);
        System.out.println("---------------------------" );

        System.out.println("开始办事");

        return null;
    }
}
